/*
Copyright © 2025 NAME HERE <EMAIL ADDRESS>
*/
package input

import (
	"io"
	"os"
	"strings"

	"github.com/atotto/clipboard"
)

// GetText 获取文本内容，按照命令行参数、标准输入、标准错误、剪贴板、用户输入的顺序尝试获取
// 返回获取到的文本内容和可能发生的错误
func GetText(args []string) (string, error) {
	var text string
	var err error

	// 判断是否有命令行参数
	if len(args) > 0 {
		// 将所有参数拼接成一个字符串
		text = JoinArgs(args)
		return text, nil
	}

	// 尝试从标准输入获取文本
	text, err = GetTextFromStdin()
	if err != nil {
		return "", err
	}

	// 如果标准输入有内容，则返回
	if text != "" {
		return text, nil
	}

	// 尝试从剪贴板获取文本
	text, err = GetTextFromClipboard()
	if err != nil {
		return "", err
	}

	if text != "" {
		return text, nil
	}

	// 所有方式都没有获取到内容，返回空字符串
	return "", nil
}

// GetTextFromClipboard 从剪贴板获取文本内容
// 返回剪贴板中的文本内容和可能发生的错误
func GetTextFromClipboard() (string, error) {
	text, err := clipboard.ReadAll()
	return text, err
}

// GetTextFromStdin 从标准输入获取文本内容
// 返回从标准输入读取的文本内容和可能发生的错误
func GetTextFromStdin() (string, error) {
	// 检查标准输入的状态
	stat, err := os.Stdin.Stat()
	if err != nil {
		return "", err
	}

	// 如果标准输入是字符设备（终端），说明没有数据被管道传入
	// 直接返回空字符串，避免阻塞等待用户输入
	if (stat.Mode() & os.ModeCharDevice) != 0 {
		return "", nil
	}

	// 如果不是字符设备，说明有数据被管道传入，可以安全读取
	data, err := io.ReadAll(os.Stdin)
	if err != nil {
		return "", err
	}

	// 转换为字符串并去除首尾空白字符
	text := strings.TrimSpace(string(data))

	return text, nil
}

// JoinArgs 将命令行参数拼接成一个字符串
// 参数为命令行参数切片，返回拼接后的字符串
func JoinArgs(args []string) string {
	result := ""
	for i, arg := range args {
		result += arg
		// 除了最后一个参数外，每个参数后添加一个空格
		if i < len(args)-1 {
			result += " "
		}
	}
	return result
}
